/**
 * @(#)Hilo.java 3/04/2009
 *
 * Copyright (c) 2005-2010 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 3/04/2009 - 10:05:36 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>3/04/2009 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.basico.hilos;

/**
 * Hilo de ejecuci&oacute;n.
 * <br/>Paquete Original: com.psiqueware.alheli.basico.hilos
 * <br/>Nombre  Original: Hilo
 * <br/>Oprima para ver : <a href="Hilo.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Angel El&eacute;ctrico</a>
 * @version Revision: 1.1 3/04/2009 10:05:36 AM
 */
public class Hilo
{

    /**
     * {@link Thread} a ejecutar.
     */
    private Thread m_thread;

    /**
     * {@link Runnable} a correr.
     */
    private Runnable m_runnable;

    /**
     * Nombre del Hilo.
     */
    private String m_nombre;

    /**
     * Descripcion del Hilo.
     */
    private String m_descripcion;

    /**
     * Dice si este {@link Hilo} es un demonio y debe ejecutarse en segundo plano.
     */
    private boolean m_segundoPlano;

    /**
     * Prioridad del hilo
     */
    private int prioridad = Thread.NORM_PRIORITY;

    /**
     * Bandera que dice si el {@link Hilo} es un proceso de Gui y debe ejecutarse en el Swing Thread.
     */
    private boolean m_swing;

    /**
     * Construye una Hilo.
     * <p>No requiere argumentos.</p>
     */
    public Hilo()
    {
    }

    public Hilo(final Runnable runnable, final String nombre)
    {
        m_runnable = runnable;
        m_nombre = nombre;
    }

    public Hilo(final Runnable runnable, final String nombre, final boolean segundoPlano)
    {
        m_runnable = runnable;
        m_nombre = nombre;
        m_segundoPlano = segundoPlano;
    }

    /**
     * Dice si el {@link Thread} contenido se esta ejecutando.
     *
     * @return <code>true</code> si se esta ejecutando; <code>false</code> en caso contrario.
     */
    public boolean isVivo()
    {
        boolean salida = m_thread != null;
        if (salida)
        {
            salida = m_thread.isAlive();
        }
        return salida;
    }

    /**
     * Devuelve el {@link Thread} a ejecutar.
     *
     * @return valor de 'thread'.
     *
     * @see Thread
     */
    Thread getThread()
    {
        return m_thread;
    }

    /**
     * Establece el {@link Thread} a ejecutar.
     *
     * @param thread nuevo valor para 'thread'.
     *
     * @see Thread
     */
    void setThread(final Thread thread)
    {
        m_thread = thread;
    }

    /**
     * Devuelve el {@link Runnable} a correr.
     *
     * @return valor de 'runnable'.
     *
     * @see Runnable
     */
    public Runnable getRunnable()
    {
        return m_runnable;
    }

    /**
     * Establece el {@link Runnable} a correr.
     *
     * @param runnable nuevo valor para 'runnable'.
     *
     * @see Runnable
     */
    public void setRunnable(final Runnable runnable)
    {
        m_runnable = runnable;
    }

    /**
     * Devuelve el Nombre del Hilo.
     *
     * @return valor de 'nombre'.
     *
     * @see String
     */
    public String getNombre()
    {
        return m_nombre;
    }

    /**
     * Establece el Nombre del Hilo.
     *
     * @param nombre nuevo valor para 'nombre'.
     *
     * @see String
     */
    public void setNombre(final String nombre)
    {
        m_nombre = nombre;
    }

    /**
     * Devuelve el Descripcion del Hilo.
     *
     * @return valor de 'descripcion'.
     *
     * @see String
     */
    public String getDescripcion()
    {
        return m_descripcion;
    }

    /**
     * Establece el Descripcion del Hilo.
     *
     * @param descripcion nuevo valor para 'descripcion'.
     *
     * @see String
     */
    public void setDescripcion(final String descripcion)
    {
        m_descripcion = descripcion;
    }

    /**
     * Devuelve el Dice si este {@link Hilo} es un demonio y debe ejecutarse en segundo plano.
     *
     * @return valor de 'segundoPlano'.
     *
     * @see boolean
     */
    public boolean isSegundoPlano()
    {
        return m_segundoPlano;
    }

    /**
     * Establece el Dice si este {@link Hilo} es un demonio y debe ejecutarse en segundo plano.
     *
     * @param segundoPlano nuevo valor para 'segundoPlano'.
     *
     * @see boolean
     */
    public void setSegundoPlano(final boolean segundoPlano)
    {
        m_segundoPlano = segundoPlano;
    }

    /**
     * Devuelve el Prioridad del hilo
     *
     * @return valor de 'prioridad'.
     *
     * @see int
     */
    public int getPrioridad()
    {
        return prioridad;
    }

    /**
     * Establece el Prioridad del hilo
     *
     * @param prioridad nuevo valor para 'prioridad'.
     *
     * @see int
     */
    public void setPrioridad(final int prioridad)
    {
        this.prioridad = prioridad;
    }


    /**
     * Devuelve la Bandera que dice si el {@link Hilo} es un proceso de Gui y debe ejecutarse en el Swing Thread.
     *
     * @return Bandera que dice si el {@link Hilo} es un proceso de Gui y debe ejecutarse en el Swing Thread.
     */
    public boolean isSwing()
    {
        return m_swing;
    }

    /**
     * Establece la Bandera que dice si el {@link Hilo} es un proceso de Gui y debe ejecutarse en el Swing Thread.
     *
     * @param swing Bandera que dice si el {@link Hilo} es un proceso de Gui y debe ejecutarse en el Swing Thread.
     */
    public void setSwing(final boolean swing)
    {
        m_swing = swing;
    }

    /**
     * Convierte este {@link Hilo} a su representaciÃ³n textual.
     *
     * @noinspection DuplicateStringLiteralInspection, HardCodedStringLiteral, HardcodedLineSeparator
     */
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("<Instance Class = '").append(this.getClass().getCanonicalName()).append("'>");
        sb.append("<nombre>").append(m_nombre).append("</nombre> ");
        sb.append("<vivo>").append(isVivo()).append("</vivo> ");
        sb.append("<segundoPlano>").append(m_segundoPlano).append("</segundoPlano> ");
        sb.append("<swing>").append(m_swing).append("</swing> ");
        sb.append("<prioridad>").append(prioridad).append("</prioridad> ");
        sb.append("</Instance>");
        return sb.toString();
    }
}

